import asyncio


async def worker_1():
    print('worker_1 start')
    await asyncio.sleep(1)
    print('worker_1 done')


async def worker_2():
    print('worker_2 start')
    await asyncio.sleep(2)
    print('worker_2 done')


async def main():
    print('before await')
    await worker_1()
    print('awaited worker_1')
    await worker_2()
    print('awaited worker_2')

%time asyncio.run(main())
'''
before await
worker_1 start
worker_1 done
awaited worker_1
worker_2 start
worker_2 done
awaited worker_2
Wall time: 3.02 s
'''
async def main2():
    # tasks = [asyncio.create_task(worker_1()),asyncio.create_task(worker_2())]
    # await asyncio.gather(*tasks)

    '''
    worker_1 start
    worker_2 start
    worker_1 done
    worker_2 done
    Wall time: 2 s
    '''

    # 下面这种方式也可以
    task1 = asyncio.create_task(worker_1())
    task2 = asyncio.create_task(worker_2())
    print('before await')
    await task1
    print('awaited worker_1')
    await task2
    print('awaited worker_2')
    '''
    before await
    worker_1 start
    worker_2 start
    worker_1 done
    awaited worker_1
    worker_2 done
    awaited worker_2
    Wall time: 2 s
    感觉就像task2在task1一开启它就会开一样 await worker_2()就没作用了
    '''
    # 所以我把 2屏蔽
    ''' 发现 确实会一起开启，但是如果await worker_2() 没有了 就不会去执行
    before await
    worker_1 start
    worker_2 start
    worker_1 done
    awaited worker_1
    awaited worker_2
    Wall time: 1.01 s
    
    这样的话 我大胆的猜测一下这个流程
    当程序遇到第一个await 命令时 
    初始化的所有task 都开始执行(起码看起来是这样 不管OS怎么调度) 把前期工做完
    直到遇到再下层的 await asyncio.sleep()
    如果遇到后 就回去检查自己的taski 是否被 await 执行，
    如果有就继续向下执行
    如果没有就停止这个task的执行
    
    
    还有一个问题 结束顺序是按先声明await的来还是按结束快慢来
    # 所以我把 await task1  2 换个位置
    async def main4():

        task1 = asyncio.create_task(worker_1())
        task2 = asyncio.create_task(worker_2())
        print('before await')
        await task2
        print('awaited worker_1')
        await task1
        print('awaited worker_2')
    #  输出
    before await
    worker_1 start
    worker_2 start
    worker_1 done
    worker_2 done
    awaited worker_1
    awaited worker_2
    Wall time: 2 s
    可以看到 
    开头信息和打印和初始化的顺序有关
    最后信息的打印和 执行时间有关
    
    所以
    1. 初始化顺序 影响
    2. await 顺序
    3. 主逻辑顺序 都要理清粗
    '''
